home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 December
/
EnigmA AMIGA RUN 23 (1997)(G.R. Edizioni)(IT)[!][issue 1997-12][EAR-CD VII].iso
/
listati
/
codice_decompressione.c
next >
Wrap
C/C++ Source or Header
|
1997-11-11
|
3KB
|
96 lines
//**********************************************************************
//* *
//* Algoritmo per la decodifica di immagini IFF-ILBM *
//* *
//***********************************************************************
Per motivi di spazio presentiamo solo la paret centrale dell'algoritmo.
Il resto del listato, adeguatamente commentato è nel CD-ROM.
struct chunk {
ULONG id;
ULONG dimens;
UBYTE *buffer;
};// CMAP CAMG e BODY hanno praticamente la stessa struttura
struct chunk_bmhd {
ULONG id;
ULONG dimens;
UWORD lx_immagine;
UWORD ly_immagine;
UWORD x_bitmap;
UWORD y_bitmap;
UBYTE piani;
UBYTE decodifica;
UBYTE compressione;
UWORD colore_trasparente;
UBYTE x_aspetto_pixel;
UBYTE y_aspetto_pixel;
UWORD lx_schermo;
UWORD ly_schermo;
};
struct chunk *cmap=NULL,
*camg=NULL,
*body=NULL;
struct chunk_bmhd bmhd; //BMHD ha grandezza fissa
struct BitMap immagine;
ULONG riga=0, bytes_per_riga=0, i, cicli=0;
UBYTE *indirizzo =NULL;
UBYTE *appo =NULL;
programma...
// Decompressione IFF
while(!bmhd.lx_immagine % 16) bmhd.lx_immagine++;
//
//l'ampiezza dell'immahine in pixel è ora multipla di 16.
//
bytes_per_riga=bmhd.lx_immagine/8;
appo=body->buffer;
//
// appo punta ai dati da decomprimere;
//
for (riga=0;riga<bmhd.ly_immagine;riga++)
{ for(num_piano=0;num_piano<bmhd.piani;num_piano++)
{ indirizzo=immagine.Planes[num_piano]+(bytes_per_riga*riga);
//
//immagine.Planes[num_piano] è il puntatore ad uno dei
//bitplane dell'immagine
//
if (bmhd.compressione==1)
{ numero_bytes=0;
while (numero_bytes<bytes_per_riga)
{ cicli=UBYTE(*(appo++));
if ((cicli)>127)
{ //
// l'immagine è risultata compressa.
//
cicli=(-cicli)+1;
for(i=0;i<cicli;i++,numero_bytes++,indirizzo++) *indirizzo=*appo;
appo++;
}
else
{ //
// I seguenti bytes non sono compressi.Trasferiamoli
// nel bitplane.
//
for(i=0;i<=cicli;i++,numero_bytes++) *(indirizzo++)=*(appo++);
}
}
}
else for(i=0;i<bytes_per_riga;i++) *(indirizzo++)=*(appo++);
// l' immagine non è compressa
}
}